package com.atguigu.jdbcprocess;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author hjwStrart
 * @time 2022-03-05 9:08
 */
public class JDBCDemo {
    public static void main(String[] args){

        try {
            test5();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

//    连接数据库方式一
    public static void test1() throws SQLException {
//        此语句中出现了第三方jar包，大大降低了程序的可移植性
        Driver driver = new com.mysql.cj.jdbc.Driver();
        Properties properties = new Properties();
        properties.setProperty("user","root");
        properties.setProperty("password","hjw123..");
//        注意MySQL8.0需要在连接时加上时区
        Connection conn = driver.connect("jdbc:mysql://localhost:3306/test?serverTimezone=UTC",properties);
        System.out.println(conn);
        conn.close();
    }

//    连接数据库方法二，改进了方法一，增强了程序的可移植性
    public static void test2() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
//        利用反射来动态获取厂商驱动
        Class<?> clazz = Class.forName("com.mysql.cj.jdbc.Driver");//此处可以通过传参的形式将需要加载的厂商驱动加载进JVM中
        Driver driver = (Driver) clazz.newInstance();
        Properties properties = new Properties();
        properties.setProperty("user","root");
        properties.setProperty("password","hjw123..");
        Connection conn = driver.connect("jdbc:mysql://localhost:3306/test?serverTimezone=UTC",properties);
        System.out.println(conn);
        conn.close();
    }

//    连接数据库方法三：使用DriverManager替换Driver
    public static void test3() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
//        第一步获取数据库驱动
        Class<?> clazz = Class.forName("com.mysql.cj.jdbc.Driver");
        Driver driver = (Driver) clazz.newInstance();
//        DriverManager是一个类，sun公司提供用来替换Driver的
//        第二步，注册驱动
        DriverManager.registerDriver(driver);
//        第三步，获取连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "hjw123..");
        System.out.println(conn);
        conn.close();

    }

//    连接数据库方法四：优化代码，减少代码量
    public static void test4() throws Exception {
//        在mysql-connector-java-8.0.26.jar\META-INF\services\java.sql.Driver，也帮我们自动加载了
//        加载厂商驱动类，这一步也可以省略
//        Class.forName("com.mysql.cj.jdbc.Driver");

        //省去了注册商场驱动的那些代码，因为mysql自动帮我们注册了
        /*
        static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
         */
        //静态代码块随着类的加载而加载

//        使用DriverManager对象获取链接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "hjw123..");
        System.out.println(conn);
        conn.close();
    }

//    连接数据库方法五（finally）：进一步优化代码，保证数据库信息安全,将数据库信息封装到配置文件中
    public static void test5() throws Exception {
        Properties properties = new Properties();
//        避免使用自定义类，使用类加载器读取配置文件信息
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("db.properties");
        properties.load(is);
//        加载驱动
        Class.forName(properties.getProperty("db.mysql.Driver"));
//        获取连接对象
        Connection conn = DriverManager.getConnection(properties.getProperty("db.url8"), properties.getProperty("db.username"), properties.getProperty("db.password"));
        System.out.println(conn);
        conn.close();

    }

}
